Shell脚本实战17-开发学生实践抓阄脚本

1. 需求

学校要举行一个活动,但是每个班参加人数的名额有限,仅限3人(班长带队)。因此需要开发一个抓阄的程序来挑选学生。

具体要求如下:

  • 执行脚本后,输入想去的同学的英文名字全拼,产生随机数(01~99之间的数字),数字越大就越有机会去参加,对于前面已经抓到的数字,下次不能再出现。
  • 输入第一个名字之后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出,继续等待别的学生输入。

2. 实现脚本

参考脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/bin/bash
FileLog=/tmp/zhuanjiu.log #<==定义最终抓阄后的结果日志
[ -f "$FileLog" ] || touch $FileLog
#<==提示用户输入名字函数,判断用户的输入是否重复
function Check_Name()
{
while true
do
read -p "Please input your English name: " name
if [ -n "$name" -a "$(grep -w "$name" $FileLog | wc -l)" -eq 0 ]
then
flag=1
break
else
echo "The name your input is null or alread exist."
continue
fi
done
}
#<==该函数生成随机数,并判断随机数是否重复
function Product_RandomNum()
{
if [ $flag -eq 1 ]
then
while true
do
RandomNum=$(expr $RANDOM % 99 + 1) #<==生成1~99的随机数
if [ $(grep -w "$RandomNum" $FileLog | wc -l) -ne 1 ]
then
echo "$name, your num is ${RandomNum}." | tee -a $FileLog
flag1=0
else
flag1=1
fi
if [ $flag1 -eq 1 ]
then
Product_RandomNum
else
Check_Name
fi
done
fi
}
function main()
{
Check_Name
Product_RandomNum
}
main

3. 执行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# > /tmp/zhuajiu.log
# sh zhuajiu.sh
Please input your English name: name1
name1, your num is 33.
Please input your English name: name2
name2, your num is 83.
Please input your English name: name1
The name your input is null or alread exist.
Please input your English name: name2
The name your input is null or alread exist.
Please input your English name: name3
name3, your num is 30.
Please input your English name: name4
name4, your num is 84.
Please input your English name: ^C
# sort -t" " -rn -k4 /tmp/zhuajiu.log
name4, your num is 84.
name3, your num is 30.
name2, your num is 83.
name1, your num is 33.
0%